<?php
namespace Amis\type;

use Amis\Basics\AmisBasics;
use Amis\type\Consts\MediaType;
use Amis\type\Consts\RequestMethod;

class Api extends AmisBasics
{
    public $method;

    /**
     * 请求方式
     * @param RequestMethod $method
     * @return $this
     */
    public function method(RequestMethod $method)
    {
        $this->method = $method;
        return $this;
    }

    /**
     * @return $this
     */
    public function get($url)
    {
        $this->method = RequestMethod::GET;
        $this->url = $url;
        return $this;
    }

    /**
     * @return $this
     */
    public function post($url)
    {
        $this->method = RequestMethod::POST;
        $this->url = $url;
        return $this;
    }

    /**
     * @return $this
     */
    public function put($url)
    {
        $this->method = RequestMethod::PUT;
        $this->url = $url;
        return $this;
    }

    /**
     * @return $this
     */
    public function del($url)
    {
        $this->method = RequestMethod::DELETE;
        $this->url = $url;
        return $this;
    }

    /**
     * 请求地址
     * @param string $url
     * @return $this
     */
    public function url(string $url)
    {
        $this->url = $url;
        return $this;
    }

    /**
     * 提交数据
     * @param array $data
     * @return $this
     */
    public function data(array $data)
    {
        $this->data = $data;
        return $this;
    }

    /**
     * 数据体格式
     * 默认为 json 可以配置成 form 或者 form-data。当 data 中包含文件时，自动会采用 form-data（multipart/form-data）格式。
     * 当配置为 form 时为 application/x-www-form-urlencoded 格式。
     * @param MediaType $dataType
     * @return $this
     */
    public function dataType(MediaType $dataType)
    {
        $this->dataType = $dataType;
        return $this;
    }

    /**
     * 当 dataType 为 form 或者 form-data 的时候有用。具体参数请参考这里，
     * 默认设置为: { arrayFormat: 'indices', encodeValuesOnly: true }
     * @param array $qsOptions
     * @return $this
     */
    public function qsOptions(array $qsOptions)
    {
        $this->qsOptions = $qsOptions;
        return $this;
    }

    /**
     * 请求头
     * @param array $headers
     * @return $this
     */
    public function headers(array $headers)
    {
        $this->headers = $headers;
        return $this;
    }

    /**
     * 请求条件
     * @param array $sendOn
     * @return $this
     */
    public function sendOn($sendOn)
    {
        $this->sendOn = $sendOn;
        return $this;
    }

    /**
     * 接口缓存时间
     * @param int $cache
     * @return $this
     */
    public function cache(int $cache)
    {
        $this->cache = $cache;
        return $this;
    }

    /**
     * 发送适配器
     * ，支持字符串串格式，或者直接就是函数如：
     * @param string $requestAdaptor
     * @return $this
     */
    public function requestAdaptor(string $requestAdaptor)
    {
        $this->requestAdaptor = $requestAdaptor;
        return $this;
    }

    /**
     * 接收适配器
     * 如果接口返回不符合要求，可以通过配置一个适配器来处理成 amis 需要的。同样支持 Function 或者 字符串函数体格式
     * @param string $adaptor
     * @return $this
     */
    public function adaptor(string $adaptor)
    {
        $this->adaptor = $adaptor;
        return $this;
    }

    /**
     * 替换当前数据
     * 返回的数据是否替换掉当前的数据，默认为 false，即：追加，设置成 true 就是完全替换。
     * @param bool $replaceData
     * @return $this
     */
    public function replaceData(bool $replaceData)
    {
        $this->replaceData = $replaceData;
        return $this;
    }

    /**
     * 返回类型
     * 如果是下载需要设置为 'blob'
     * @param string $responseType
     * @return $this
     */
    public function responseType(string $responseType)
    {
        $this->responseType = $responseType;
        return $this;
    }

    /**
     * 配置是否需要自动刷新接口。
     * @param string $autoRefresh
     * @return $this
     */
    public function autoRefresh(string $autoRefresh)
    {
        $this->autoRefresh = $autoRefresh;
        return $this;
    }

    /**
     * 配置返回数据
     * 对返回结果做个映射
     * @param array $responseData
     * @return $this
     */
    public function responseData(array $responseData)
    {
        $this->responseData = $responseData;
        return $this;
    }

    /**
     * 配置跟踪变量表达式
     * @param string $trackExpression
     * @return $this
     */
    public function trackExpression(string $trackExpression)
    {
        $this->trackExpression = $trackExpression;
        return $this;
    }
}